#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>

#define N 10

sem_t sem_a, sem_b, sem_c;

void *print_A(void *arg)
{
    for (int i = 0; i < N; i++)
    {
        sem_wait(&sem_a);
        printf("A");
        sem_post(&sem_b);
    }
    return NULL;
}

void *print_B(void *arg)
{
    for (int i = 0; i < N; i++)
    {
        sem_wait(&sem_b);
        printf("B");
        sem_post(&sem_c);
    }
    return NULL;
}

void *print_C(void *arg)
{
    for (int i = 0; i < N; i++)
    {
        sem_wait(&sem_c);
        printf("C");
        sem_post(&sem_a);
    }
    return NULL;
}

int main()
{
    pthread_t thread1, thread2, thread3;

    // 初始化信号量
    sem_init(&sem_a, 0, 1); // 初始化为1，允许线程A首先执行
    sem_init(&sem_b, 0, 0); // 初始化为0，线程B必须等待
    sem_init(&sem_c, 0, 0); // 初始化为0，线程C必须等待

    // 创建线程
    pthread_create(&thread1, NULL, print_A, NULL);
    pthread_create(&thread2, NULL, print_B, NULL);
    pthread_create(&thread3, NULL, print_C, NULL);

    // 等待线程完成
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);
    pthread_join(thread3, NULL);

    // 销毁信号量
    sem_destroy(&sem_a);
    sem_destroy(&sem_b);
    sem_destroy(&sem_c);

    printf("\n");
    return 0;
}